Rationalise initialisation of cpu_possible_map.
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 8 Feb 2006 10:10:52 +0000 (11:10 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Wed, 8 Feb 2006 10:10:52 +0000 (11:10 +0100)
Signed-off-by: Keir Fraser <keir@xensource.com>
linux-2.6-xen-sparse/drivers/xen/core/smpboot.c

index 91f507299bceb72434aa6bce2285c64965447623..5940fe816b7e59e8b93c0dad2fed1878d38952e6 100644 (file)
@@ -85,6 +85,9 @@ void __init prefill_possible_map(void)
 {
        int i, rc;
 
+       if (!cpus_empty(cpu_possible_map))
+               return;
+
        for (i = 0; i < NR_CPUS; i++) {
                rc = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL);
                if (rc == -ENOENT)
@@ -208,7 +211,7 @@ void vcpu_prepare(int vcpu)
 
 void __init smp_prepare_cpus(unsigned int max_cpus)
 {
-       int cpu, rc;
+       int cpu;
        struct task_struct *idle;
 
        cpu_data[0] = boot_cpu_data;
@@ -223,11 +226,9 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
        if (max_cpus != 0)
                xen_smp_intr_init(0);
 
-       for (cpu = 1; cpu < max_cpus; cpu++) {
-               rc = HYPERVISOR_vcpu_op(VCPUOP_is_up, cpu, NULL);
-               if (rc == -ENOENT)
-                       break;
-               BUG_ON(rc != 0);
+       for_each_cpu_mask (cpu, cpu_possible_map) {
+               if (cpu == 0)
+                       continue;
 
                cpu_data[cpu] = boot_cpu_data;
                cpu_2_logical_apicid[cpu] = cpu;
@@ -257,7 +258,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
                        (void *)cpu_gdt_descr[cpu].address,
                        XENFEAT_writable_descriptor_tables);
 
-               cpu_set(cpu, cpu_possible_map);
 #ifdef CONFIG_HOTPLUG_CPU
                if (xen_start_info->flags & SIF_INITDOMAIN)
                        cpu_set(cpu, cpu_present_map);
@@ -286,7 +286,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
 
 void __devinit smp_prepare_boot_cpu(void)
 {
-       cpu_possible_map = cpumask_of_cpu(0);
+       prefill_possible_map();
        cpu_present_map  = cpumask_of_cpu(0);
        cpu_online_map   = cpumask_of_cpu(0);
 }